iT邦幫忙

2022 iThome 鐵人賽

DAY 28
0

看完初始化之後要來看反初始化,有正就有反,有陰就有陽。大家都可以成為,功夫熊貓(X)

反初始化

反初始化器只適用於 Class 類型,當一個 Class 的實例被釋放之前,反初始化器就會立刻被調用。
反初始化器的標示用 deinit 來標示。

反初始化過程原理

Swift 通常會自動釋放不再需要的實例已釋放資源,也通過 ARC 處理實例的內存管理,通常當實例被釋放時不需要手動去清理。只有在一些情況下需要手動清除,例如,創建了一個自定義的 Class 來打開一個文件,並寫入一些數據,那可能要在那個 Class 實例釋放前手動關閉該文件。

在 Class 定義中每個 Class 只能有一個反初始化器,而且反初始化器不帶任何參數或者圓括弧。

deinit {
    
}

反初始化器是在實例釋放時會自動調用的,而反初始化器是不能被主動調用的。子類會繼承父類的反初始化器,並且在子類反初始化器觸發後,父類的反初始化器也會被自動調用。即使子類沒有提供自己的反初始化器,父類的反初始化器也會被自動調用。

因為只有反初始化器被調用,實例才會被釋放,所以反初始化器可以訪問實例的所有屬性,並且可以根據屬性修改他的行為。

反初始化器的應用

來看一下官方的例子

class Bank {
    static var coinsInBank = 10_000
    static func distribute(coins numberOfCoinsRequested: Int) -> Int {
        let numberOfCoinsToVend = min(numberOfCoinsRequested, coinsInBank)
        coinsInBank -= numberOfCoinsToVend
        return numberOfCoinsToVend
    }
    static func receive(coins: Int) {
        coinsInBank += coins
    }
}

這邊先定義了一個 Bank 來做管理虛擬硬幣的機制,然後裡面確保流通的硬幣永遠不會超過 10000 個。
這個 Bank 裡面還有兩個方法 distribute(coins:) 跟 receive(coins:) 來做分發跟收集。

distribute 會在使用的時候先檢查裡面的硬幣是否還足夠,如果不夠的話就會回傳一個比請求時還小的數值。

receive 則是將前回收到 Bank 中。

接下來我們在來定義一個 Player

class Player {
    var coinsInPurse: Int
    init(coins: Int) {
        coinsInPurse = Bank.distribute(coins: coins)
    }
    func win(coins: Int) {
        coinsInPurse += Bank.distribute(coins: coins)
    }
    deinit {
        Bank.receive(coins: coinsInPurse)
    }
}

Player 裡面定義了 win(coins:) 的方法來獲取 Bank 裡面一定數量的硬幣,並且添加到 Player 身上。而裡面也有一個反初始化器,如果 Player 實例被釋放則會把硬幣全部歸還給 Bank 。

所以實例之後可以有以下操作

playerOne!.win(coins: 2_000)
print("PlayerOne won 2000 coins & now has \(playerOne!.coinsInPurse) coins")
// 打印“PlayerOne won 2000 coins & now has 2100 coins”
print("The bank now only has \(Bank.coinsInBank) coins left")
// 打印“The bank now only has 7900 coins left”

playerOne = nil
print("PlayerOne has left the game")
// 打印“PlayerOne has left the game”
print("The bank now has \(Bank.coinsInBank) coins")
// 打印“The bank now has 10000 coins”

好的 今天就先到這裡。


上一篇
30天的 iOS 修仙道路 (27)
下一篇
30天的 iOS 修仙道路 (29)
系列文
30天的 iOS 修仙道路 站穩腳步基礎篇30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言